package com.ffggffgfv.backend.service.impl;

import com.ffggffgfv.backend.entity.Permission;
import com.ffggffgfv.backend.mapper.PermissionMapper;
import com.ffggffgfv.backend.service.PermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 权限服务实现类
 */
@Service
public class PermissionServiceImpl implements PermissionService {

    @Autowired
    private PermissionMapper permissionMapper;

    /**
     * 查询所有权限（树形结构）
     *
     * @param type     权限类型（可选）
     * @param parentId 父级ID（可选）
     * @return 权限列表
     */
    @Override
    public List<Permission> findAll(Integer type, Long parentId) {
        // 查询权限列表
        List<Permission> permissions = permissionMapper.selectAll(type, parentId);

        // 如果查询的是顶级权限，则构建树形结构
        if (parentId == null && (type == null || type == 1)) {
            return buildTree(permissions);
        }

        return permissions;
    }

    /**
     * 根据ID查询权限
     *
     * @param id 权限ID
     * @return 权限对象
     */
    @Override
    public Permission findById(Long id) {
        return permissionMapper.selectById(id);
    }

    /**
     * 创建权限
     *
     * @param permission 权限对象
     * @return 创建的权限对象
     */
    @Override
    public Permission createPermission(Permission permission) {
        // 设置创建时间
        permission.setCreateTime(new Date());

        // 插入数据
        permissionMapper.insert(permission);

        return permission;
    }

    /**
     * 判断权限编码是否已存在
     *
     * @param code 权限编码
     * @return 是否存在
     */
    @Override
    public boolean isCodeExists(String code) {
        return permissionMapper.selectByCode(code) != null;
    }

    /**
     * 构建权限树
     *
     * @param permissions 权限列表
     * @return 树形权限列表
     */
    @Override
    public List<Permission> buildTree(List<Permission> permissions) {
        List<Permission> trees = new ArrayList<>();
        Map<Long, Permission> permissionMap = new HashMap<>();

        // 将所有权限放入map
        for (Permission permission : permissions) {
            permissionMap.put(permission.getId(), permission);
        }

        // 构建树形结构
        for (Permission permission : permissions) {
            Long parentId = permission.getParentId();

            // 如果是根节点，则添加到结果集
            if (parentId == null || parentId == 0) {
                trees.add(permission);
            } else {
                // 如果不是根节点，则添加到父节点的children
                Permission parent = permissionMap.get(parentId);
                if (parent != null) {
                    if (parent.getChildren() == null) {
                        parent.setChildren(new ArrayList<>());
                    }
                    parent.getChildren().add(permission);
                }
            }
        }

        return trees;
    }
}
